package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaProd;
import com.sisgesbyte.services.administracion.bean.CategoriaProdBean;
import com.sisgesbyte.services.administracion.bean.CategoriaProdListaResponse;
import com.sisgesbyte.services.proyeccion.ProyeccionProductoPorPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProductosResponse;
import com.sisgesbyte.services.proyeccion.bean.ProductoProyeccionBean;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;

@ManagedBean
@ViewScoped
public class ProyeccionProductosPeriodosMBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private ProyeccionProductoPorPeriodoService proyeccionProductoPorPeriodoService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private MantenimientoCategoriaProd mantenimientoCategoriaProd;
	
	@ManagedProperty(value = "#{proyeccionVentasMBean}")
	private ProyeccionVentasMBean proyeccionVentasMBean;
	
	private List<ProductoProyeccionBean> listaAvanceProductos;
	private List<PeriodoBean> listaPeriodos;
	private List<CategoriaProdBean> listaCategoriaProductos;
	private List<CategoriaProdBean> listaCategoriaPadres;
	private List<CategoriaProdBean> listaCategoriaHijos;
	private int idCategoriaProducto;
	private FiltrosSQLBean cadenaFiltros;
	private String txtBuscar;
	private List<CategoriaProdBean> categoriaHijos;
	
	@PostConstruct
	public void init() {
		txtBuscar="";
		cargarCategorias();
		inicializar();
		categoriaHijos = new ArrayList<CategoriaProdBean>();
	}
	
	public void inicializar(){
		AvanceProductosResponse proyeccionPeriodo =null;
		try {
			proyeccionPeriodo = proyeccionProductoPorPeriodoService.listaAvanceProductosPorPeriodo(ObtenerIdTransaccion(),cadenaFiltros, proyeccionVentasMBean.getPeriodoDefault());
		}catch(Exception e){
			System.out.println("Error al cargar Proyeccion de Productos" + e);
		}
		if(Integer.valueOf(proyeccionPeriodo.getCodigoRespuesta()) > -1){
			this.listaAvanceProductos=proyeccionPeriodo.getListaAvanceProductos();
		}
	}

	public void cargarCategorias(){
		try{
			
			CategoriaProdListaResponse categorias = mantenimientoCategoriaProd.listaCategoriasProducto(ObtenerIdTransaccion(), null);
			listaCategoriaProductos = new ArrayList<CategoriaProdBean>();
			listaCategoriaPadres = new ArrayList<CategoriaProdBean>();
			listaCategoriaHijos = new ArrayList<CategoriaProdBean>();
			for(CategoriaProdBean ls :categorias.getListaCategoriaProductos()){
				if(ls.getPadre_id()==0){
					listaCategoriaPadres.add(ls);
				}else{
					listaCategoriaHijos.add(ls);
				}
			}

			for(CategoriaProdBean ls :listaCategoriaPadres){
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		}catch(Exception e){
			System.out.println("Error al cargar las categorias: " + e);
		}
	}

	//metodo para obtener la estructura de hijos de una categoria
	public void mostrarHijos(int padreId) {
		
		for (CategoriaProdBean ls : listaCategoriaHijos) {
			if (padreId == ls.getPadre_id()) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		}
	}
	
	public void obtenerCategoriaHijos(int idPadre){
		for(CategoriaProdBean ls :listaCategoriaPadres){
			if (idPadre == ls.getId()) {
				categoriaHijos.add(ls);
			}
		}
		for (CategoriaProdBean ls : listaCategoriaProductos) {
			if (idPadre == ls.getPadre_id()) {
				categoriaHijos.add(ls);
				obtenerCategoriaHijos(ls.getId());
			}
		}
	}
	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try{
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		}catch(Exception e){
			sessionId="Error";
			System.out.println("Error al obtener Session" + e);
		}

		return sessionId;
	}
	
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try{
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			if(getTxtBuscar() !=null  && getTxtBuscar().toString().length() > 0){
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("cp.nombre");
				campo.add("p.cod_prod");
				campo.add("p.producto");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				valores.add("%"+getTxtBuscar() + "%");
			}
			
			if(getIdCategoriaProducto() >0){
				categoriaHijos.clear();
				obtenerCategoriaHijos(getIdCategoriaProducto());
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("p.categoria_producto_id");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("in");
				listaCampo.setNumeroValores(categoriaHijos.size());
				filtro.add(listaCampo);
				for(CategoriaProdBean ls : categoriaHijos){
					valores.add(ls.getId());
				}
				if(categoriaHijos.size() ==0){
					valores.add(0);
				}
			}
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			setCadenaFiltros(filtroSQL);
			inicializar();
		}catch(Exception e){
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("p.producto");
			filtroSQL.setTipoOrden("asc");
		}
	}
	
	public List<ProductoProyeccionBean> getListaAvanceProductos() {
		return listaAvanceProductos;
	}
	public void setListaAvanceProductos(
			List<ProductoProyeccionBean> listaAvanceProductos) {
		this.listaAvanceProductos = listaAvanceProductos;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}


	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public List<CategoriaProdBean> getListaCategoriaProductos() {
		return listaCategoriaProductos;
	}

	public void setListaCategoriaProductos(
			List<CategoriaProdBean> listaCategoriaProductos) {
		this.listaCategoriaProductos = listaCategoriaProductos;
	}

	public List<CategoriaProdBean> getListaCategoriaPadres() {
		return listaCategoriaPadres;
	}

	public void setListaCategoriaPadres(List<CategoriaProdBean> listaCategoriaPadres) {
		this.listaCategoriaPadres = listaCategoriaPadres;
	}

	public List<CategoriaProdBean> getListaCategoriaHijos() {
		return listaCategoriaHijos;
	}

	public void setListaCategoriaHijos(List<CategoriaProdBean> listaCategoriaHijos) {
		this.listaCategoriaHijos = listaCategoriaHijos;
	}

	public int getIdCategoriaProducto() {
		return idCategoriaProducto;
	}

	public void setIdCategoriaProducto(int idCategoriaProducto) {
		this.idCategoriaProducto = idCategoriaProducto;
	}

	public ProyeccionVentasMBean getProyeccionVentasMBean() {
		return proyeccionVentasMBean;
	}

	public void setProyeccionVentasMBean(ProyeccionVentasMBean proyeccionVentasMBean) {
		this.proyeccionVentasMBean = proyeccionVentasMBean;
	}
}
